package com.qingyun.system.model.vo;

import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.qingyun.system.utils.BeanUtils;
import com.qingyun.system.utils.CollUtils;
import com.qingyun.system.utils.Convert;
import lombok.AllArgsConstructor;
import lombok.Getter;
import lombok.NoArgsConstructor;
import lombok.Setter;

import java.io.Serial;
import java.util.List;
import java.util.function.Function;
import java.util.stream.Collectors;

/**
 * 分页查询返回结果
 * @param <T>
 */
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class PageVO<T> implements java.io.Serializable {

    @Serial
    private static final long serialVersionUID = 1L;
    /**
     * 总记录数
     */
    private Long total;

    /**
     * 数据列表
     */
    private List<T> list;



    public static <T> PageVO<T> empty(Long total, Long pages) {
        return new PageVO<>(total,CollUtils.emptyList());
    }
    public static <T> PageVO<T> empty(Page<?> page) {
        return new PageVO<>(page.getTotal(),CollUtils.emptyList());
    }

    public static <T> PageVO<T> of(Page<T> page) {
        if(page == null){
            return new PageVO<>();
        }
        if (CollUtils.isEmpty(page.getRecords())) {
            return empty(page);
        }
        return new PageVO<>(page.getTotal(),page.getRecords());
    }
    public static <T,R> PageVO<T> of(Page<R> page, Function<R, T> mapper) {
        if(page == null){
            return new PageVO<>();
        }
        if (CollUtils.isEmpty(page.getRecords())) {
            return empty(page);
        }
        return new PageVO<>(page.getTotal(),page.getRecords().stream().map(mapper).collect(Collectors.toList()));
    }
    public static <T> PageVO<T> of(Page<?> page, List<T> list) {
        return new PageVO<>(page.getTotal(),list);
    }

    public static <T, R> PageVO<T> of(Page<R> page, Class<T> clazz) {
        return new PageVO<>(page.getTotal(), BeanUtils.copyList(page.getRecords(), clazz));
    }

    public static <T, R> PageVO<T> of(Page<R> page, Class<T> clazz, Convert<R, T> convert) {
        return new PageVO<>(page.getTotal(), BeanUtils.copyList(page.getRecords(), clazz, convert));
    }
}
